package cn.alex.sso.client.demo.controller;

import cn.alex.sso.client.demo.config.LscConfig;
import cn.alex.sso.client.demo.util.LscUtil;
import cn.alex.sso.client.demo.util.SignUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * @author Alex
 * @date 2025/1/9 下午1:57
 */
@RestController
@RequestMapping("/lc-sso")
public class LscController {

    @GetMapping("/getAppInfo")
    public Map getAppInfo() {
        Map<String, String> appInfo = new HashMap<>();
        appInfo.put("appId", LscConfig.APP_ID);
        appInfo.put("serverUrl", LscConfig.SERVER_URL);
        appInfo.put("authUrl", LscConfig.AUTH_URL);
        return appInfo;
    }


    /**
     * 校验票据
     *
     * @param ticket 票据
     * @return 结果
     */
    @GetMapping("/checkTicket")
    public String checkTicket(String ticket) {
        String userId = LscUtil.checkTicket(ticket);
        if (StrUtil.isBlank(userId)) {
            return "";
        }

        // 当前登录的用户ID已经拿到
        return login(userId);
    }

    /**
     * 接收同步的数据
     */
    @PostMapping("/receiveSyncData")
    public String receiveUserData(@RequestBody Map<String, Object> data) {
        // 拿到同步的数据, 进行处理
        String d = LscUtil.decrypt(MapUtil.getStr(data, "data"));

        System.out.println(JSONUtil.formatJsonStr(d));

        return "接收成功";
    }

    /**
     * 退出登录
     *
     * @param userId 用户ID
     */
    @GetMapping("/logout")
    public String ssoLogout(String userId) {
        // TODO: 执行本系统的退出逻辑
        logout(userId);

        // 单点退出
        LscUtil.ssoLogout(userId);
        return "ok";
    }


    /**
     * 单点注销回调地址
     * 别的系统退出登录后, 统一认证平台会通知已登录的系统, 让本系统也退出登录
     */
    @RequestMapping("/logoutCall")
    public Object ssoLogoutCall(String loginId, String timestamp, String nonce, String sign) {
        // 校验签名
        Boolean checkSign = SignUtil.checkSign(loginId, timestamp, nonce, sign);
        if (checkSign) {
            return "无效签名，拒绝应答";
        }


        // 调用本系统的退出
        logout(loginId);
        return "账号id=" + loginId + " 注销成功";
    }

    /**
     * 本系统自己的登录逻辑
     */
    public String login(String userId) {
        // TODO: 处理本系统的登录逻辑

        return "token-" + userId;
    }


    /**
     * 本系统自己的退出逻辑
     *
     * @param userId 用户ID
     */
    public void logout(String userId) {

    }
}
